package com.qf.common.advice;

import com.qf.common.exception.BusinessException;
import com.qf.common.util.ResultInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * <p>全局异常拦截器，处理系统异常时，能保证客户能够收到友好的提示信息</p>
 *
 * <p>@ControllerAdvice：增强型控制器，对控制器的全局异常配置放在同一个位置，全局异常的注解，放在类型</p>
 *
 * <p>@ControllerAdvice默认只会处理controller层抛出的异常，如果需要处理service层的异常，
 * 需要定义一个自定义的Exception来继承RuntimeException类，然后@Exception(MyException)即可</p>
 *
 * <p>@ExceptionHandler：指明需要处理的异常类型以及子类。注解放在方法上面。</p>
 */
@ControllerAdvice
public class GlobalExceptionAdvice {
    private static final Logger log =  LoggerFactory.getLogger(GlobalExceptionAdvice.class);

    @ExceptionHandler(BusinessException.class)
    @ResponseBody
    public ResultInfo handlerBusinessException(BusinessException e) {
        log.error("业务操作异常", e);
        return ResultInfo.error(e.getCode(), e.getMsg());
    }

    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public ResultInfo handlerNullPointerException(NullPointerException e) {
        log.error("空指针异常", e);
        return ResultInfo.error(500, "业务操作异常，请联系管理员");
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResultInfo handlerBusinessException(Exception e) {
        log.error("业务操作异常，请联系管理员", e);
        return ResultInfo.error(500, "业务操作异常，请联系管理员");
    }
}
